package bean;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

/**
 * Estrutura de dados usada no algoritmo de compressao/descompressao de
 * arquivos. Usa-se uma hashtable para guardar o par chave-valor, sendo a chave
 * um caractere ou uma sequencia de caracteres e o valor e o indice deste(s)
 * caracter(es). Eh usada uma lista tambem, para facilitar na sincronizacao
 * entre tabelas de compressao/descompressao.
 * 
 * @author Anderson Almeida
 * @author Giovani Barbosa
 * 
 */
public class Mapa {
	Hashtable<String, Integer> dic;
	List<String> lista;

	public Mapa() {
		dic = new Hashtable<String, Integer>();
		lista = new ArrayList<String>();
	}

	/**
	 * Adiciona um valor ao Mapa
	 * 
	 * @param chave
	 *            O caractere a ser adicionado ao mapa
	 */
	public void add(String chave) {
		dic.put(chave, lista.size());
		lista.add(chave);
	}

	/**
	 * Retorna um caractere, dado o indice
	 * 
	 * @param indice
	 *            O indice do caractere no mapa
	 * @return O caractere (ou sequencia destes) desejado(a) ou NULL caso o
	 *         indice seja maior que o tamanho do Mapa
	 */
	public String getValue(int indice) {
		if (indice >= lista.size()) {
			return null;
		}
		return lista.get(indice);
	}

	/**
	 * Retorna um indice, dado o caractere
	 * 
	 * @param chave
	 *            Um caractere
	 * @return O indice dele no Mapa ou -1 se ele nao estiver no Mapa
	 */
	public int getIndex(String chave) {
		if (!dic.containsKey(chave)) {
			return -1;
		}
		return dic.get(chave);
	}

}
